import type { Router } from 'vue-router'
import { useTitle } from '@vueuse/core'
import { Keys } from '@/constants'
import { useAuthStore } from '@/store'
import { localStg } from '@/utils'
import { PageNames } from '@/router/routes/pagenames'

/**
 * 路由守卫函数
 * @param router - 路由实例
 */
export function createRouterGuard(router: Router) {
    router.beforeEach(async (to, from, next) => {
        console.debug('页面跳转：', to, from)
        if (to.name == PageNames.LOGIN) {
            if (from.name == PageNames.LOGIN) {
                return false
            }
            //如果是登录页，直接跳转
            return next()
        }

        const authStore = useAuthStore()
        if (!localStg.get(Keys.TOKEN)) {
            console.debug('未检测到token，跳转登录页')
            //token没了，直接跳转登录页
            return next({ name: PageNames.LOGIN, query: { redirect: to.fullPath } })
        } else if (authStore.initDone == false) {
            //第一次打开页面，localstorage中也有token，就要尝试加载用户信息，看token过没过期
            console.debug('检测到token，但权限数据尚未初始化，开始初始化')
            await authStore.init()
            console.debug('初始化完成，开始进入页面', to)
            return next(to.fullPath)
        }
        // 开始 loadingBar
        window.$loadingBar?.start()
        //如果auth为false，代表不需要校验权限，直接跳转,如果auth为undefined，代表只需要登录权限，上面代码已经处理过了
        if (!to.meta?.auth) {
            return next()
        }
        //其他情况就是需要校验数据了
        if (!authStore.checkHasPermission(to.meta.auth as string | string[])) {
            //说明无权限
            return next({ name: PageNames._403 })
        }

        if (to.name == PageNames.NOT_FOUND) {
            //说明没匹配到路由，跳转404
            return next({ name: PageNames._404 })
        }
        //todo 页面跳转权限处理
        return next()
    })
    router.afterEach((to) => {
        // 设置document title
        // useTitle(to.meta.i18nTitle ? $t(to.meta.i18nTitle) : to.meta.title)
        useTitle(to.meta?.title as string)
        // 结束 loadingBar
        window.$loadingBar?.finish()
    })
}
